package com.gzx.risk.core.utils;

import cn.hutool.core.io.FileUtil;
import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageUtil {
	/**
	 * 合并图片
	 * 
	 * @Title: mergeTwoFromInternet
	 * @param file1
	 * @param file2
	 * @param newFileName
	 * @return
	 */
	public static File mergeTwoFromInternet(File file1, File file2, String newFileName) {
		try {
			String suffix = "." + FileUtil.getType(file1);
			BufferedImage bi1 = ImageIO.read(file1);
			BufferedImage bi2 = ImageIO.read(file2);
			int w1 = bi1.getWidth();
			int w2 = bi2.getWidth();

			if (w1 > w2) {
				bi2 = Thumbnails.of(bi2).width(w1).asBufferedImage();
			} else if (w2 > w1) {
				bi1 = Thumbnails.of(bi1).width(w2).asBufferedImage();
			}
			// 调用mergeImage方法获得合并后的图像
			BufferedImage mergedImage = mergeImage(bi1, bi2, false);
			File tempFile = File.createTempFile(newFileName, suffix);
			ImageIO.write(mergedImage, suffix.substring(1), tempFile);
			return tempFile;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 待合并的两张图必须满足这样的前提，如果水平方向合并，则高度必须相等；如果是垂直方向合并，宽度必须相等。 mergeImage方法不做判断，自己判断。
	 * * @param img1 待合并的第一张图
	 * 
	 * @param img2         带合并的第二张图
	 * @param isHorizontal 为true时表示水平方向合并，为false时表示垂直方向合并
	 * @return 返回合并后的BufferedImage对象
	 * @throws IOException
	 */
	public static BufferedImage mergeImage(BufferedImage img1, BufferedImage img2, boolean isHorizontal)
			throws IOException {
		int w1 = img1.getWidth();
		int h1 = img1.getHeight();
		int w2 = img2.getWidth();
		int h2 = img2.getHeight();

		// 从图片中读取RGB
		int[] ImageArrayOne = new int[w1 * h1];
		ImageArrayOne = img1.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
		int[] ImageArrayTwo = new int[w2 * h2];
		ImageArrayTwo = img2.getRGB(0, 0, w2, h2, ImageArrayTwo, 0, w2);

		// 生成新图片
		BufferedImage DestImage = null;
		if (isHorizontal) { // 水平方向合并
			DestImage = new BufferedImage(w1 + w2, h1, BufferedImage.TYPE_INT_RGB);
			DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
			DestImage.setRGB(w1, 0, w2, h2, ImageArrayTwo, 0, w2);
		} else { // 垂直方向合并
			DestImage = new BufferedImage(w1, h1 + h2, BufferedImage.TYPE_INT_RGB);
			DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
			DestImage.setRGB(0, h1, w2, h2, ImageArrayTwo, 0, w2); // 设置下半部分的RGB
		}
		return DestImage;
	}

	/**
	 * 图片缩放(300KB以内)
	 * 
	 * @Title: scaleImages
	 * @Description: 图片缩放，处理分辨率级大小过大问题
	 * @param imageFile
	 * @param tempFileName - 2个字符以上的临时文件名称
	 * @throws Exception
	 */
	public static File scaleImages(File imageFile,String tempFileName) throws Exception {
		long size = FileUtil.size(imageFile);
		String suffix = "." + FileUtil.getType(imageFile);
		File outFile = File.createTempFile(tempFileName, suffix);
		try {
			if (size < 300 * 1024) {
				Thumbnails.of(imageFile).size(1080, 1080).outputFormat(FileUtil.getType(imageFile)).toFile(outFile);
			} else {
				//outputQuality,图片压缩质量-90%差不多
				Thumbnails.of(imageFile).size(1080, 1080).outputQuality(0.9f).outputFormat(FileUtil.getType(imageFile)).toFile(outFile);
			}
			return outFile;
		} catch (Exception e) {
			throw new Exception("图片尺寸转换失败", e);
		}
	}
}
